<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>数据类型</title>
</head>
<body>
    <script>
        "use strict";
        /*
            Javascript5种基本数据类型
                undefined null boolean number string
            1种复杂数据类型
                object
            
            typeof操作符：用来检测变量的数据类型
            对于一个值使用typeof操作符可能返回下列某个字符串：
                undefined-如果这个值未定义
                boolean-如果这个值是布尔值
                string-如果这个值是字符串
                number-如果这个值是数值
                object-如果这个值是对象或null
                function-如果这个值是函数

            undefined类型：
                这种类型只有一个值，即特殊的undefined。
                在使用var声明变量但未对其加以初始化时，这个变量的值就是undefined

            null类型：
                null类型是第二个只有一个值的数据类型，这个类型的值是null。
                从逻辑来看，null值表示一个空对象的指针，而这也证明使用typeof操作符检测null时会返回object

                如果定义的变量准备在将来用于保存对象，那么最好将该变量初始化为null而不是其他值。
                这样，只要检查是否为null值，就可以知道相应的变量是否已经保存了一个对象

                实际上，undefined的值是派生自null值得，因此ECMA-262规定对他们相等性测试要返回true。
                    console.log(undefined == null); // true
                    console.log(undefined === null); // false

            boolean类型：
                boolean类型是ECMAScript中使用的最多的一种类型，该类型只有两个字面值：true和false
                这两个值与数字值不是一回事，因此true不一定等于数字1，而false也不一定等于数字0

                boolean类型的字面量的值true和false是区分大小写的，也就是说，True和False（以及其他的大小写混合形式）
                都不是boolean的值，只是标识符

                虽然boolean类型的字面量的值只有两个，但是ESMAScript中所有类型的值都有与这两个布尔值等价的值。
                要将一个值转换为一个等价的值，可以调用转型函数Boolean()，

                各种数据类型对应的转型规则：
                    数据类型        转换为true的值              转换为false的值
                    Boolean         true                       false
                    String          任何非空字符串              ""（空字符串）
                    Number          任何非零数字值(包括无穷大)   0和NaN
                    Object          任何对象                    null
                    Undefined       n/a                         undefined

            Number类型：
                Number类型使用IEEE754格式来表示整数和浮点数值（浮点数值在某些语言中也被称为双精度值）

                为了支持各种数据类型，ECMA-262定义了不同的数值字面量格式：
                    最基本的数值字面量格式是十进制整数：
                        var intNum = 10;
                    八进制字面值得第一位必须是0：
                        var num1 = 070; // 八进制的56
                        var num2 = 079; // 无效的八进制，解析为79
                        八进制的字面量在严格模式下是无效的，会导致支持该模式的JS引擎抛出错误
                    十六进制的字面量值得前两位必须是0x：
                        var num1 = 0xA; // 十六进制的10
                        var num2 = 0x1f; // 十六进制的31
                    在进行算术计算时，八进制和十六进制表示的数值最终将被转换成十进制数值。
                
                数值范围：
                    ECMAScript能够表示的最小值保存在Number.MIN_VALUE中，在大多数浏览器中，这个值是5e-324，能够表示的最大数值保存在
                    Number.MAX_VALUE中，在大多数浏览器中，这个值是1.7976931348623157e+308，如果某次计算的结果得到了一个超出了JS数值
                    最大范围的值，那么这个数值将会转换成特殊的Infinity值。具体来说，如果这个数是负数，则会被转成-Infinity(负无穷)，
                    如果这个数值是整数，则会被转换成Infinity(正无穷)

                    如果某次计算返回了正或负的Infinity，那么该值将无法参与下一次的运算，因为Infinity是不能够参与计算的数值。
                    要想确定一个数值是不是有穷的（换句话说，是不是位于Number的最大值和最小值之间），可以使用isFinite()函数。
                    这个函数在参数位于Number的最大值和最小值之间返回true。

                    访问Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY也可以得到负和正的Infinity值

                NaN：
                    NaN，即非数值(Not a Number)是一个特殊的值，这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)
                    在ECMAScript中，任何数除以非数值都会返回NaN，因此不会影响其他代码执行。

                    NaN有两个非同寻常的特点：
                        1、任何涉及NaN的操作，都会返回NaN
                        2、NaN与任何值都不相等，包括NaN本身

                    针对这两个特点，ECMAScript定义了isNaN()函数，这个函数接受一个参数，该参数可以使任何类型，而函数会帮我们确定这个参数是否不是数值。
                    isNaN()函数在接收到一个值后，会尝试将这个值转换为数值，某些不是数值的值会直接转换为数值，而任何不能被转换为数值的值都会导致这个函数
                    返回true。

                    isNaN()函数也适用于对象，在基于对象调用isNaN()函数时，会首先调用对象的valueOf()方法，然后确定该方法的返回值是否可以转换为数值。
                    如果不能，则基于这个对象的返回值再调用toString()方法，再测试返回值。而这个过程也是ECMAScript中内置函数和操作符的一般执行过程。


        */

        console.log(Number.MAX_VALUE); // 1.7976931348623157e+308

        var result = Number.MAX_VALUE + Number.MAX_VALUE;
        console.log(result); // Infinity
        console.log(isFinite(result)); // false

        console.log(Number.NEGATIVE_INFINITY); // -Infinity
        console.log(Number.POSITIVE_INFINITY); // Infinity
        
    </script>
</body>
</html>